﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ED_Nivelacion.Negocios.Clases_Tontas;
using ED_Nivelacion.Datos;

namespace ED_Nivelacion.Negocios.Catalogos
{
    public class reporte_C
    {
        Datos.ED_NivelacionEntities _objConexion = new Datos.ED_NivelacionEntities();

        public List<Reporte> reporteCalificacionDocente(int _idDocente, int _idPeriodo)
        {

            List<Reporte> _objLista = new List<Reporte>();
            reporte_C _objDatosReporte = new reporte_C();
            try
            {


                var resultMaterias = new DistribucionAcademica_C().FiltrarDistribucionAcademicaXidDocenteANdidPEriodo(_idDocente, _idPeriodo);
               
                var resultCriterios = new CriterioEvaluacion_C().ObtenerCriterio();

                foreach (var item in resultMaterias)
                {


                    double SUMCoordinador = 0;
                    double SUMAutoevaluacion = 0;

                    double SUMCoTutor = 0;
                    double SUMHeteroEvaluacion = 0;
                    double promedioFinal = 0;

                    foreach (var itemCriterios in resultCriterios)
                    {
                        var PesoCriterioCoordinador = 0;
                        var PesoCriterioAutoevaluacion = 0;
                        var PesoCriterioCoTutor = 0;
                        var PesoCriterioHeteroEvaluacion = 0;

                        if (new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(2, itemCriterios.idCriterio_Evaluacion,_idPeriodo).Count != 0)
                        {
                            PesoCriterioCoordinador = new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(2, itemCriterios.idCriterio_Evaluacion, _idPeriodo).First().Ponderacion;
                        }


                        if (new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(4, itemCriterios.idCriterio_Evaluacion, _idPeriodo).Count != 0)
                        {
                            PesoCriterioAutoevaluacion = new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(4, itemCriterios.idCriterio_Evaluacion, _idPeriodo).First().Ponderacion;
                        }

                        if (new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(3, itemCriterios.idCriterio_Evaluacion, _idPeriodo).Count != 0)
                        {
                            PesoCriterioCoTutor = new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(3, itemCriterios.idCriterio_Evaluacion, _idPeriodo).First().Ponderacion;
                        }
                        if (new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(1, itemCriterios.idCriterio_Evaluacion, _idPeriodo).Count != 0)
                        {
                            PesoCriterioHeteroEvaluacion = new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(1, itemCriterios.idCriterio_Evaluacion, _idPeriodo).First().Ponderacion;
                        }
                       
                        SUMAutoevaluacion += (_objDatosReporte.promedioAutoevaluacionXIdCriterio(itemCriterios.idCriterio_Evaluacion, item.idDistribucion_Academica, _idPeriodo)*25) * ((double)PesoCriterioAutoevaluacion / 100);
                        SUMCoTutor += (_objDatosReporte.promedioCoTutorXIdCriterio(itemCriterios.idCriterio_Evaluacion, item.idDistribucion_Academica, _idPeriodo) * 25) * ((double)PesoCriterioCoTutor / 100);
                        SUMCoordinador += (_objDatosReporte.promedioCoCoordinadorXIdCriterio(itemCriterios.idCriterio_Evaluacion, _idDocente, _idPeriodo) * 25) * ((double)PesoCriterioCoordinador / 100);
                        SUMHeteroEvaluacion += (_objDatosReporte.promedioHeteroevaluacionXIdCriterio(itemCriterios.idCriterio_Evaluacion, item.idDistribucion_Academica, _idPeriodo) * 25) * ((double)PesoCriterioHeteroEvaluacion / 100);
                    }

                    _objLista.Add(new Reporte { autoevaluacion = Math.Round(SUMAutoevaluacion, 2), carrera = item.Carrera, coCoordinador = Math.Round(SUMCoTutor, 2), coDirector = Math.Round(SUMCoordinador, 2), materia = item.Nombre_Asignatura, coHeteroevaluacion = Math.Round(SUMHeteroEvaluacion, 2), paralelo = item.Paralelo, porCurso = Math.Round((SUMHeteroEvaluacion + SUMCoTutor + SUMCoordinador + SUMAutoevaluacion), 2), codFormulario = "Cod" });
                }

                return _objLista;
            }
            catch (Exception)
            {
                return _objLista;                
            }
        }

        public List<Reporte> reporteEvaluacionXCarrera(int _idCarrera, string _paralelo, int _idPeriodo)
        {
            var valorCoordinador = 0;
            var valorAutoevaluacion = 0;
            var valorCoTutor = 0;
            var valorHeteroEvaluacion = 0;
            reporte_C _objDatosReporte = new reporte_C();
            List<Reporte> _objListado = new List<Reporte>();
            try
            {
                var resultDistribuciones = _objConexion.SP_ObtenerDistribucionesXCarreraXperiodo(_idCarrera, _paralelo, _idPeriodo);

                var resultCriterios = new CriterioEvaluacion_C().ObtenerCriterio();
                var valoresActores = new ValoracionActor_C().ObtenerValoracionActorXPeriodo(_idPeriodo);
                if (valoresActores.Count == 4)
                {
                    //Estudiante 1
                    //Coordinador 2
                    //Tutor 3 
                    //Docente 4

                    valorCoordinador = valoresActores.Where(E => E.idActor == 2).First().Valor;
                    valorAutoevaluacion = valoresActores.Where(E => E.idActor == 4).First().Valor;
                    valorCoTutor = valoresActores.Where(E => E.idActor == 3).First().Valor;
                    valorHeteroEvaluacion = valoresActores.Where(E => E.idActor == 1).First().Valor;
                }
                foreach (var item in resultDistribuciones)
                {

                    double SUMCoordinador = 0;
                    double SUMAutoevaluacion = 0;
                    double SUMCoTutor = 0;
                    double SUMHeteroEvaluacion = 0;
                    double promedioFinal = 0;

                    foreach (var itemCriterios in resultCriterios)
                    {
                        var PesoCriterioCoordinador = 0;
                        var PesoCriterioAutoevaluacion = 0;
                        var PesoCriterioCoTutor = 0;
                        var PesoCriterioHeteroEvaluacion = 0;

                        if (new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(2, itemCriterios.idCriterio_Evaluacion, _idPeriodo).Count != 0)
                        {
                            PesoCriterioCoordinador = new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(2, itemCriterios.idCriterio_Evaluacion, _idPeriodo).First().Ponderacion;
                        }


                        if (new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(4, itemCriterios.idCriterio_Evaluacion, _idPeriodo).Count != 0)
                        {
                            PesoCriterioAutoevaluacion = new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(4, itemCriterios.idCriterio_Evaluacion, _idPeriodo).First().Ponderacion;
                        }

                        if (new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(3, itemCriterios.idCriterio_Evaluacion, _idPeriodo).Count != 0)
                        {
                            PesoCriterioCoTutor = new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(3, itemCriterios.idCriterio_Evaluacion, _idPeriodo).First().Ponderacion;
                        }
                        if (new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(1, itemCriterios.idCriterio_Evaluacion, _idPeriodo).Count != 0)
                        {
                            PesoCriterioHeteroEvaluacion = new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(1, itemCriterios.idCriterio_Evaluacion, _idPeriodo).First().Ponderacion;
                        }
                        SUMAutoevaluacion += (_objDatosReporte.promedioAutoevaluacionXIdCriterio(itemCriterios.idCriterio_Evaluacion, item.idDistribucion_Academica, _idPeriodo) * 25) * ((double)PesoCriterioAutoevaluacion / 100);
                        SUMCoTutor += (_objDatosReporte.promedioCoTutorXIdCriterio(itemCriterios.idCriterio_Evaluacion, item.idDistribucion_Academica, _idPeriodo) * 25) * ((double)PesoCriterioCoTutor / 100);
                        SUMCoordinador += (_objDatosReporte.promedioCoCoordinadorXIdCriterio(itemCriterios.idCriterio_Evaluacion, item.idDocente, _idPeriodo) * 25) * ((double)PesoCriterioCoordinador / 100);
                        SUMHeteroEvaluacion += (_objDatosReporte.promedioHeteroevaluacionXIdCriterio(itemCriterios.idCriterio_Evaluacion, item.idDistribucion_Academica, _idPeriodo) * 25) * ((double)PesoCriterioHeteroEvaluacion / 100);
                    }

                    var promedioCriterioAutoevalucion = SUMAutoevaluacion * ((double)valorAutoevaluacion / 100);
                    var promedioCriterioTutor = SUMCoTutor * ((double)valorCoTutor / 100);
                    var promedioCriterioCoordinador = SUMCoordinador * ((double)valorCoordinador / 100);
                    var promedioCriterioHetero = SUMHeteroEvaluacion * ((double)valorHeteroEvaluacion / 100);

                    _objListado.Add(new Reporte { autoevaluacion = Math.Round(SUMAutoevaluacion, 2), carrera = item.Carrera, coCoordinador = Math.Round(SUMCoTutor, 2), coDirector = Math.Round(SUMCoordinador, 2), materia = item.Nombre_Asignatura, coHeteroevaluacion = Math.Round(SUMHeteroEvaluacion, 2), paralelo = item.Paralelo, porCurso = Math.Round((promedioCriterioAutoevalucion + promedioCriterioCoordinador + promedioCriterioHetero + promedioCriterioTutor), 2), codFormulario = "Cod" });
                }

                return _objListado;
            }
            catch (Exception)
            {

                return _objListado;
            }
        }
        public List<Reporte> reporteEvaluacionSNNA(int _idPeriodo)
        {
            var valorCoordinador = 0;
            var valorAutoevaluacion = 0;
            var valorCoTutor = 0;
            var valorHeteroEvaluacion = 0;
            reporte_C _objDatosReporte = new reporte_C();
            List<Reporte> _objListadoCarrera = new List<Reporte>();
            try
            {
                var resultCarrera = new Paralelo_C().ObtenerParaleloXIDPeriodo(_idPeriodo);
                foreach (var itemCarrera in resultCarrera)
                {
                    List<Reporte> _objListadoDistribucion = new List<Reporte>();

                    var resultDistribuciones = _objConexion.SP_ObtenerDistribucionesXCarreraXperiodo(itemCarrera.idCarrera, itemCarrera.ParaleloNombre, _idPeriodo);

                    var resultCriterios = new CriterioEvaluacion_C().ObtenerCriterio();
                    var valoresActores = new ValoracionActor_C().ObtenerValoracionActorXPeriodo(_idPeriodo);
                    if (valoresActores.Count == 4)
                    {
                        //Estudiante 1
                        //Coordinador 2
                        //Tutor 3 
                        //Docente 4

                        valorCoordinador = valoresActores.Where(E => E.idActor == 2).First().Valor;
                        valorAutoevaluacion = valoresActores.Where(E => E.idActor == 4).First().Valor;
                        valorCoTutor = valoresActores.Where(E => E.idActor == 3).First().Valor;
                        valorHeteroEvaluacion = valoresActores.Where(E => E.idActor == 1).First().Valor;
                    }
                    foreach (var item in resultDistribuciones)
                    {


                        double SUMCoordinador = 0;
                        double SUMAutoevaluacion = 0;

                        double SUMCoTutor = 0;
                        double SUMHeteroEvaluacion = 0;
                        double promedioFinal = 0;


                        foreach (var itemCriterios in resultCriterios)
                        {
                            var PesoCriterioCoordinador = 0;
                            var PesoCriterioAutoevaluacion = 0;
                            var PesoCriterioCoTutor = 0;
                            var PesoCriterioHeteroEvaluacion = 0;
                            if (new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(2, itemCriterios.idCriterio_Evaluacion, _idPeriodo).Count != 0)
                            {
                                PesoCriterioCoordinador = new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(2, itemCriterios.idCriterio_Evaluacion, _idPeriodo).First().Ponderacion;
                            }


                            if (new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(4, itemCriterios.idCriterio_Evaluacion, _idPeriodo).Count != 0)
                            {
                                PesoCriterioAutoevaluacion = new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(4, itemCriterios.idCriterio_Evaluacion, _idPeriodo).First().Ponderacion;
                            }

                            if (new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(3, itemCriterios.idCriterio_Evaluacion, _idPeriodo).Count != 0)
                            {
                                PesoCriterioCoTutor = new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(3, itemCriterios.idCriterio_Evaluacion, _idPeriodo).First().Ponderacion;
                            }
                            if (new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(1, itemCriterios.idCriterio_Evaluacion, _idPeriodo).Count != 0)
                            {
                                PesoCriterioHeteroEvaluacion = new DistribucionCriterio_C().FiltrarDCriteriosXActorIdCriterioANDIdPeriod(1, itemCriterios.idCriterio_Evaluacion, _idPeriodo).First().Ponderacion;
                            }
                            SUMAutoevaluacion += (_objDatosReporte.promedioAutoevaluacionXIdCriterio(itemCriterios.idCriterio_Evaluacion, item.idDistribucion_Academica, _idPeriodo) * 25) * ((double)PesoCriterioAutoevaluacion / 100);
                            SUMCoTutor += (_objDatosReporte.promedioCoTutorXIdCriterio(itemCriterios.idCriterio_Evaluacion, item.idDistribucion_Academica, _idPeriodo) * 25) * ((double)PesoCriterioCoTutor / 100);
                            SUMCoordinador += (_objDatosReporte.promedioCoCoordinadorXIdCriterio(itemCriterios.idCriterio_Evaluacion, item.idDocente, _idPeriodo) * 25) * ((double)PesoCriterioCoordinador / 100);
                            SUMHeteroEvaluacion += (_objDatosReporte.promedioHeteroevaluacionXIdCriterio(itemCriterios.idCriterio_Evaluacion, item.idDistribucion_Academica, _idPeriodo) * 25) * ((double)PesoCriterioHeteroEvaluacion / 100);
                        }

                        var promedioCriterioAutoevalucion = SUMAutoevaluacion * ((double)valorAutoevaluacion / 100);
                        var promedioCriterioTutor = SUMCoTutor * ((double)valorCoTutor / 100);
                        var promedioCriterioCoordinador = SUMCoordinador * ((double)valorCoordinador / 100);
                        var promedioCriterioHetero = SUMHeteroEvaluacion * ((double)valorHeteroEvaluacion / 100);
                        _objListadoDistribucion.Add(new Reporte { autoevaluacion = Math.Round(SUMAutoevaluacion, 2), carrera = item.Carrera, coCoordinador = Math.Round(SUMCoTutor, 2), coDirector = Math.Round(SUMCoordinador, 2), materia = item.Nombre_Asignatura, coHeteroevaluacion = Math.Round(SUMHeteroEvaluacion, 2), paralelo = item.Paralelo, porCurso = Math.Round((promedioCriterioAutoevalucion + promedioCriterioCoordinador + promedioCriterioHetero + promedioCriterioTutor), 2), codFormulario = "Cod" });
                    }

                    _objListadoCarrera.Add(new Reporte { autoevaluacion = Math.Round((_objListadoDistribucion.Sum(E => E.autoevaluacion) / _objListadoDistribucion.Count), 2), carrera = itemCarrera.carrera, coCoordinador = Math.Round((_objListadoDistribucion.Sum(E => E.coCoordinador) / _objListadoDistribucion.Count), 2), coDirector = Math.Round((_objListadoDistribucion.Sum(E => E.coDirector) / _objListadoDistribucion.Count), 2), coHeteroevaluacion = Math.Round((_objListadoDistribucion.Sum(E => E.coHeteroevaluacion) / _objListadoDistribucion.Count), 2), paralelo = itemCarrera.ParaleloNombre, porCurso = Math.Round((_objListadoDistribucion.Sum(E => E.porCurso) / _objListadoDistribucion.Count), 2) });
                }
                return _objListadoCarrera;
            }
            catch (Exception)
            {

                return _objListadoCarrera;
            }
        }


        public int nrodeEstudiantesPruebaXidDistribucion(int _idDistribucion, int _periodo)
        {
            try
            {
                return _objConexion.SP_FiltrarCountEstudiantesPruebaXIDDistribucion(_idDistribucion, _periodo).First().Value;
            }
            catch (Exception)
            {

                return 0;
            }
        }

        public double promedioHeteroevaluacionXIdCriterio(int _idCriterio, int _idDistribucion, int _idPeriodo)
        {
            try
            {
                return _objConexion.SP_PromedioHeteroEvaluacionValorXidCriterio(_idCriterio, _idDistribucion, _idPeriodo).First().Value;
            }
            catch (Exception)
            {

                return 0;
            }
        }

        public double promedioAutoevaluacionXIdCriterio(int _idCriterio, int _idDistribucion, int _idPeriodo)
        {
            try
            {
                return _objConexion.SP_PromedioAutoEvaluacionValorXidCriterio(_idCriterio, _idDistribucion, _idPeriodo).First().Value;
            }
            catch (Exception)
            {

                return 0;
            }
        }

        public double promedioCoTutorXIdCriterio(int _idCriterio, int _idDistribucion, int _idPeriodo)
        {
            try
            {
                return _objConexion.SP_PromedioCoTutorValorXidCriterio(_idCriterio, _idDistribucion, _idPeriodo ).First().Value;
            }
            catch (Exception)
            {

                return 0;
            }
        }

        public double promedioCoCoordinadorXIdCriterio(int _idCriterio, int _idDocente, int _idPeriodo)
        {
            try
            {
                return _objConexion.SP_PromedioCoCoordinadorValorXidCriterio(_idCriterio, _idDocente, _idPeriodo).First().Value;
            }
            catch (Exception)
            {

                return 0;
            }
        }

        public double resultadoAutoevaluacionPreguntaXIdPreguntaANDIdDistribucion(int _idPregunta, int _idDistribucion, int _idPeriodo)
        {
            try
            {
                return _objConexion.SP_ResultadosXPreguntaAutoEvaluacionValorXidCriterio(_idDistribucion, _idPregunta, _idPeriodo).First().Value;
            }
            catch (Exception)
            {

                return 0;
            }
        }
        public double resultadoHeteroevaluacionPreguntaXIdPreguntaANDIdDistribucion(int _idPregunta, int _idDistribucion, int _idPeriodo)
        {
            try
            {
                return _objConexion.SP_ResultadosXPreguntaHeteroevaluacionValorXidCriterio(_idDistribucion, _idPregunta, _idPeriodo).First().Value;
            }
            catch (Exception)
            {

                return 0;
            }
        }

        public double resultadoCotutorPreguntaXIdPreguntaANDIdDistribucion(int _idPregunta, int _idDistribucion, int _idPeriodo)
        {
            try
            {
                return _objConexion.SP_ResultadosXPreguntaCoTutorValorXidCriterio(_idDistribucion, _idPregunta, _idPeriodo).First().Value;
            }
            catch (Exception)
            {

                return 0;
            }
        }

        public double resultadoCoCoordinadorPreguntaXIdPreguntaANDIdDistribucion(int _idPregunta, int _idDocente, int _idPeriodo)
        {
            try
            {
                return _objConexion.SP_ResultadosXPreguntaCoCoordinadorValorXidCriterio(_idDocente, _idPregunta, _idPeriodo).First().Value;
            }
            catch (Exception)
            {

                return 0;
            }
        }


        public double DesviacionEstandarHeteroevaluacionPreguntaXIdPreguntaANDIdDistribucion(int _idPregunta, int _idDistribucion, int _idPeriodo)
        {
            try
            {
                var media = _objConexion.SP_ResultadosXPreguntaHeteroevaluacionValorXidCriterio(_idDistribucion, _idPregunta, _idPeriodo).First().Value;


                var result = _objConexion.SP_ListaResultadosXPreguntaHeteroevaluacionValorXidCriterio(_idDistribucion, _idPregunta, _idPeriodo).ToList();

                double sumVarianza = 0;
                
                foreach (var item in result)
                {
                    var resta = (double)item.PromedioPregunta - media;
                    sumVarianza = sumVarianza + (Math.Pow(resta,  2));
                }

                var varianza = sumVarianza / (result.Count - 1);
                var desviacion = Math.Sqrt(varianza);
                return desviacion;
            }
            catch (Exception)
            {

                return 0;
            }
        }
    }
}
